package aiP.A3.FOLKSBankAdapter.BusinessLogicLayer;

/**
 * Created with IntelliJ IDEA.
 * User: Andreas
 * Date: 12.06.14
 * Time: 12:47
 * To change this template use File | Settings | File Templates.
 */


import aiP.A3.BuchhaltungKomponente.AccessLayer.BuchhaltungKomponenteFacade;
import aiP.A3.BuchhaltungKomponente.AccessLayer.IBuchhaltungServicesFuerBankadapter;
import aiP.A3.BuchhaltungKomponente.DataAccessLayer.DTO.ZahlungseingangDTO;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.Date;

/**
 * BANK ADAPTER!
 */
public class BankAdapterBusinessLogic {

    // Name der zu Verwendeten Queue:
    private final static String QUEUE_NAME = "Zahlungseingaenge";

    // Entsprechender Host, für die Queue:
    private final static String HOST = "localhost";

    // Facade Objekt erstellen
    // private IBuchhaltungServicesFuerBankadapter iBSFB = new BuchhaltungKomponenteFacade();
    private IBuchhaltungServicesFuerBankadapter iBSFB;

    public QueueingConsumer consumer;
    public Channel channel;


    public BankAdapterBusinessLogic() {
        this.iBSFB = new BuchhaltungKomponenteFacade();
    }


    // interne KLasse um Zahlungseingang-Objekte zu bauen
    class ZahlungseingangDetailDTO {

        private Date eingangsdatum;
        private int rechnungNr;
        private float betrag;

        public ZahlungseingangDetailDTO(int rechnunNr, float betrag, Date eingansdatum) {
            this.rechnungNr = rechnunNr;
            this.betrag = betrag;
            this.eingangsdatum = eingansdatum;
        }

        public String ToString() {
            return "Rechnungsnr.: " + getRechnungNr() + " Betrag: " + getBetrag() + " Eingangsdatum: " + getEingangsdatum();
        }

        public Date getEingangsdatum() {
            return this.eingangsdatum;
        }

        public void setEingangsdatum(Date eingangsdatum) {
            this.eingangsdatum = eingangsdatum;
        }

        public int getRechnungNr() {
            return this.rechnungNr;
        }

        public void setRechnungNr(int rechnungNr) {
            this.rechnungNr = rechnungNr;
        }

        public float getBetrag() {
            return betrag;
        }

        public void setBetrag(float betrag) {
            this.betrag = betrag;
        }
    }


    //TODO überlegen wie,wann das Verbuchen von zahlungseingängen geschehen soll
    public static void main(String[] args) {

        System.out.println("Warte auf Nachrichten aus der Queue: " + QUEUE_NAME + ".");

        try {

            BankAdapterBusinessLogic p = new BankAdapterBusinessLogic();
            p.empfangeZahlungseingaenge();


        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void empfangeZahlungseingaenge() throws IOException, InterruptedException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(HOST);
        Connection connection = factory.newConnection();
        channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME, true, consumer);

        ZahlungsThread zT = new ZahlungsThread();
        zT.start();
        Thread.sleep(1500);
        zT.interrupt();


    }

    // interne Klasse um mit einem Thread alle Zahlungseingänge zu holen
    private class ZahlungsThread extends Thread {

        @Override
        public void run() {
            while (!isInterrupted()) {

                QueueingConsumer.Delivery delivery = null;
                try {
                    delivery = consumer.nextDelivery();
                    System.out.println("delivery = " + delivery);

                    String message = new String(delivery.getBody());
                    System.out.println("message = " + message);
                    String parts[] = message.split(";");

                    int rechnungsNr = Integer.parseInt(parts[0]);
                    float betrag = Float.parseFloat(parts[1]);
                    System.out.println("Zahlungseingang erhalten: Nr. = " + rechnungsNr + " ; Betrag = " + betrag);

                    // Zahlungseingangobjekt bauen...
                    // ZahlungseingangDetailDTO zeDetailDTO;
                    ZahlungseingangDetailDTO zeDetailDTO = new ZahlungseingangDetailDTO(rechnungsNr, betrag, new Date());

                    // ...und der Buchhaltung geben (zum Persistieren)
                    ZahlungseingangDTO zeDTO = new ZahlungseingangDTO();
                    zeDTO.setRechnungNr(zeDetailDTO.getRechnungNr());
                    zeDTO.setEingangsdatum(zeDetailDTO.getEingangsdatum());
                    zeDTO.setBetrag(zeDetailDTO.getBetrag());
                    System.out.println("Verbuche Zahlungseingang mit Rechnungsnr: " + zeDTO.getRechnungNr());
                    iBSFB.CreateZahlungseingang(zeDTO);
                } catch (InterruptedException e) {
                    this.interrupt();
                }


            }
            System.out.println("tst");
        }
    }

}
